/*
 * ==================================================
 * 项目开发者：JerryStark
 * 开发者Email：4771007@qq.com
 * 开发者QQ:4771007
 * 开发范围：web，wap，android,ios,osx or win or linux 应用
 * ==================================================
 */
package RTGame.Configs;

import RTPower.RTFile;
import static RTPower.RTFile.d_error;
import RTPower.RTMD5;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import java.io.File;
import java.io.IOException;

/**
 * 配置文件扫描类
 * <br>扫描目录是否存在
 * <br>扫描配置文件是否存在
 *
 * @author jerry
 */
public class ScanFilesPath {

    /**
     * 扫描总方法:扫描所有的配置目录和配置文件是否都存在
     * <br>config
     * <br>config/lottery
     * <br>以及config/MainConfig.json
     */
    public static void ScanAll() {
        ScanPath();
        ScanMainConfig();

        ScanLotteryPathFiles();
    }

    /**
     * 扫描所有的配置文件对应的目录是否存在
     * <br>不存在则创建
     */
    public static void ScanPath() {
        //检查config总目录存在不,不存在则创建
        //检查目录,不存在自动创建
        RTFile.CreateDirectory("Config");
        RTFile.CreateDirectory("Config/Lottery");
        RTFile.CreateDirectory("Config/Ball");
    }

    /**
     * 扫描主配置文件格式和内容
     * <br>如果文件存在,但是内容格式是不正确的,则刷入模板配置
     * <br>完成后把json对象赋予Load 的mainconfig 对象
     */
    public static void ScanMainConfig() {
//检查文件存在不,不存在自动创建
        String FilePath = "Config/MainConfig.json";
        boolean file_is_have = ScanOneFileIsFalseTheAddNew(FilePath);
        //如果文件不存在,自动创建的肯定是空的,再写入模板内容进去
        if (!file_is_have) {

            Gson json = new GsonBuilder().setPrettyPrinting().create();
            String new_json = json.toJson(DefaultMainJsonObject());
            RTFile.Write(FilePath, new_json, false);
        }
        //读取主配置文件,空内容则写入默认模板值
        JsonObject file_json = (JsonObject) RTFile.ReadJsonFileToOtherTypeObject(FilePath, JsonObject.class);

        //写出给load 的对象
        Load.MainConfig = file_json;
    }

    /**
     * 检查一个文件是否存在,不存在则创建一个空文件
     * <br>并自动写入json
     *
     * @param file_path
     * @return boolean 存在则true 不存在,新创建了就false
     */
    private static boolean ScanOneFileIsFalseTheAddNew(String file_path) {
        File file = new File(file_path);
        if (!file.exists()) {
            try {

                file.createNewFile();
                return false;

            } catch (IOException ex) {
                d_error(ex, "创建新文件失败" + file_path);
            }
        }

        return true;
    }

    /**
     * 返回默认的主配置文件json对象
     *
     * @return
     */
    private static JsonObject DefaultMainJsonObject() {
        JsonObject new_main_config = new JsonObject();

        //默认的配置会给出一个等待初始化,要用户手工配置,配置过后Status=start
        new_main_config.addProperty("Status", "wait_init");
        //程序的监听端口
        new_main_config.addProperty("ServerPort", "8080");
        //传输token,默认用时间戳加密MD5得到
        String token_md5 = RTMD5.MD5(String.valueOf(System.currentTimeMillis()));
        new_main_config.addProperty("Token", token_md5);

        //加入mysql 的默认配置
        new_main_config.add("Mysql", DefaultMysqlConfigObject());
        //加入urlpush 默认配置
        new_main_config.add("UrlPush", DefaultUrlPushConfigObject());

        return new_main_config;

        //加入urlpush默认配置
    }

    /**
     * 获得mysql的默认模板配置json对象
     *
     * @return
     */
    private static JsonObject DefaultMysqlConfigObject() {

        //mysql 的模板
        JsonObject new_mysql_config = new JsonObject();
        //mysql的状态,start stop,关闭则不写出到数据库,配置就不生效
        new_mysql_config.addProperty("status", "stop");
        new_mysql_config.addProperty("server_ip", "127.0.0.1");
        new_mysql_config.addProperty("server_port", "3306");
        new_mysql_config.addProperty("username", "name");
        new_mysql_config.addProperty("password", "pass");
        new_mysql_config.addProperty("data_name", "data");
        new_mysql_config.addProperty("table_name", "table");
        //mysql的存储键值数组
        JsonObject mysql_keys = new JsonObject();
        //这里可以多个添加,key=数据库的字段名,value=数据库存储的值(使用程序产生的变量名)
        //值带 $为变量 |为方法格式为aaa="参数###","参数" 普通的字符就是普通值
        mysql_keys.addProperty("l_game_type", "{$tag}");
        mysql_keys.addProperty("l_game_number", "{$orderid}");
        mysql_keys.addProperty("l_game_open_list", "{$numbers}");
        mysql_keys.addProperty("l_game_open_time", "{$time}|date=Y-m-d,###");
        mysql_keys.addProperty("l_game_status", "over");

        new_mysql_config.add("save_data_conf", mysql_keys);
        return new_mysql_config;
    }

    /**
     * 获得urlpush 的默认配置
     *
     * @return
     */
    private static JsonObject DefaultUrlPushConfigObject() {
        JsonObject new_push_config = new JsonObject();
        new_push_config.addProperty("status", "stop");
        new_push_config.addProperty("url", "http://127.0.0.1/");
        new_push_config.addProperty("param", "orderid={$orderid}&number={$numbers}");
        return new_push_config;
    }

    /**
     * 扫描彩票的配置文件夹,得到所有的过滤完毕的文件对象组
     * <br>按照尾缀的tag来分组
     * <br>[config][chongqing]
     * <br>[odds][chongqing]
     * <br>方便扩展
     */
    private static void ScanLotteryPathFiles() {
        File dir = new File("Config/Lottery");
        File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组
      
        if (files != null) {
            for (int f = 0; f < files.length; f++) {

                //拆分文件名
                String[] one_file_name = (files[f].getName()).replace(".json", "").split("_");
                
                //检查文件是否是标准格式的配置文件,是就加载
                //数组长度等于2才是需要的正规配置
                if (one_file_name.length < 2) {
                    continue;
                }
           
                //读取配置文件
                JsonObject file_json = (JsonObject) RTFile.ReadJsonFileToOtherTypeObject("Config/Lottery/" + files[f].getName(), JsonObject.class);
    
                //属于2 了,第一个是游戏名称,第二个是配置文件类型
                if (one_file_name[1].equals("rule")) {
                    Load.LotteryRuleConfig.add(one_file_name[0], file_json);
                }
                if (one_file_name[1].equals("config")) {
                    Load.LotteryConfig.add(one_file_name[0], file_json);
                }
            }
        }
    }

}
